package com.zhx.common.chat.dao;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhx.common.chat.domain.entity.Message;
import com.zhx.common.chat.domain.enums.MessageStatusEnum;
import com.zhx.common.chat.domain.vo.request.ChatMessagePageReq;
import com.zhx.common.chat.domain.vo.response.ChatMessageResp;
import com.zhx.common.chat.mapper.MessageMapper;
import com.zhx.common.chat.service.IMessageService;
import com.zhx.common.common.domain.vo.resp.CursorPageBaseResp;
import com.zhx.common.common.util.CursorUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * <p>
 * 消息表 服务实现类
 * </p>
 *
 * @author zhx
 * @since 2024-04-24
 */
@Service
public class MessageDao extends ServiceImpl<MessageMapper, Message> {


    /**
     * 计算指定房间内，从某个消息ID到另一个消息ID之间的消息数量。
     * @param roomId 房间ID，指定计算消息数量的房间。
     * @param fromId 起始消息ID，计算从该ID之后（包括该ID）的消息数量。
     * @param toId 结束消息ID，计算到该ID之前（包括该ID）的消息数量。
     * @return 返回指定范围内消息的数量。
     */
    public Integer getGapCount(Long roomId, Long fromId, Long toId) {
        return lambdaQuery()
                .eq(Message::getRoomId,roomId)
                .gt(Message::getId,fromId)
                .le(Message::getId,toId)
                .count();
    }

    public CursorPageBaseResp<Message> getCursorPage(Long roomId, ChatMessagePageReq req, Long lastMsgId) {
        return CursorUtils.getCursorPageByMysql(this,req,wrapper ->{
            wrapper.eq(Message::getRoomId,roomId);
            wrapper.eq(Message::getStatus, MessageStatusEnum.NORMAL.getStatus());
            wrapper.le(Objects.nonNull(lastMsgId),Message::getId,lastMsgId);
        },Message::getId);
    }

    public Integer getUnReadCount(Long roomId, Date readTime) {
        return lambdaQuery()
                .eq(Message::getRoomId, roomId)
                .gt(Objects.nonNull(readTime), Message::getCreateTime, readTime)
                .count();
    }

    //根据房间id和用户id逻辑删除消息
    public Boolean removeByRoomId(Long roomId, List<Long> uidList) {
        if (CollectionUtil.isNotEmpty(uidList)) {
            LambdaUpdateWrapper<Message> wrapper = new UpdateWrapper<Message>().lambda()
                    .eq(Message::getRoomId, roomId)
                    .in(Message::getFromUid, uidList)
                    .set(Message::getStatus, MessageStatusEnum.DELETE.getStatus());
            return this.update(wrapper);
        }
        return false;
    }

    public void invalidByUid(Long uid) {
        lambdaUpdate()
                .eq(Message::getFromUid, uid)
                .set(Message::getStatus, MessageStatusEnum.DELETE.getStatus())
                .update();
    }
}
